package com.pattern.singleton.register;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Description  容器式单例
 * 优点：能够全局的设置对象为单例
 *
 * @author hubiao
 * @since 2020-08-23 17:05
 */
public class ContainerSingleton {

    /**
     * 2.创建一个容器
     */
    private static Map<String, Object> ioc = new ConcurrentHashMap<>();

    /**
     * 1.私有化构造函数
     */
    private ContainerSingleton() {
    }

    /**
     * 3.提供一个全局的访问点
     * 缺点：要考虑并发线程安全性问题
     */
    public static Object getBean(String className) {
        //保证并发线程安全性问题
        synchronized (ContainerSingleton.class) {
            if (!ioc.containsKey( className )) {
                Object object = null;
                try {
                    //通过简单工厂模式获取对象
                    object = Class.forName( className ).newInstance();
                    ioc.put( className, object );
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return object;
            }
        }
        return ioc.get( className );
    }
}
